const { log } = require("console");



// console.log('同步输出1');
// setTimeout(() => {
//   console.log('异步输出');
// }, 1000);
// console.log('同步2');
// console.log('同步3');
// console.log('同步4');

// 地狱回调
// console.log('同步输出1');
// setTimeout(() => {
//   console.log('异步输出');
//   console.log('同步2');
//   console.log('同步3');
//   console.log('同步4');
// }, 1000);

// 调整代码
// 程序执行开始 打印 '同步输出1'
// console.log('同步输出1');
// setTimeout(() => {
//   console.log('异步输出');
//   console.log('同步2');
//   console.log('同步3');
//   console.log('同步4');
// }, 1000);
// 如果一个程序中有多个异步代码段，如下案例
// setTimeout(() => {
//   console.log('异步执行1');
// }, 3000);

// setTimeout(() => {
//   console.log('异步执行2');
// }, 2000);

// setTimeout(() => {
//   console.log('异步执行3');
// }, 1000);

// 定时器
// setTimeout(() => {
//   console.log('异步执行1');
//   setTimeout(() => {
//     console.log('异步执行2');
//     setTimeout(() => {
//       console.log('异步执行3');

//     }, 1000);

//   }, 2000);

// }, 3000);

// + 每个异步代码块封装成函数
// + 调用函数的同时传入一个匿名函数作为形参
// + 在函数中执行回调函数（传入的匿名函数），传入实参
// + 将第二个异步函数
// function asyncFun1(callBack) {
//   setTimeout(() => {

//     callBack('异步执行1')

//   }, 3000);
// }

// function asyncFun2(callBack, str) {
//   setTimeout(() => {

//     callBack('异步执行2' + str)

//   }, 2000);
// }

// function asyncFun3(callBack, str) {
//   setTimeout(() => {

//     callBack('异步执行3' + str)

//   }, 1000);
// }
// asyncFun1((asyncFun1Res) => {
//   console.log(asyncFun1Res);

//   asyncFun2((asyncFun2Res) => {
//     console.log(asyncFun2Res);

//     asyncFun3((asyncFun3Res) => {
//       console.log(asyncFun3Res);

//     }, asyncFun2Res)
//   }, asyncFun1Res)
// })

// 使用 Promise 来处理异步操作解决地狱回调简介
// asyncDemo1.ts
// function asyncFun1(str?: string): Promise<string> {
//   return new Promise((resolve) => {
//     setTimeout(() => {
//       resolve(`异步执行1${str || ''}`);
//     }, 3000);
//   });
// }

// function asyncFun2(str?: string): Promise<string> {
//   return new Promise((resolve) => {
//     setTimeout(() => {
//       resolve(`异步执行2${str || ''}`);
//     }, 2000);
//   });
// }

// function asyncFun3(str?: string): Promise<string> {
//   return new Promise((resolve) => {
//     setTimeout(() => {
//       resolve(`异步执行3${str || ''}`);
//     }, 1000);
//   });
// }
// function callAsyncFunctions3() {
//   asyncFun1()
//     .then(asyncFun1Res => {
//       console.log(asyncFun1Res);
//       return asyncFun2(asyncFun1Res);
//     })
//     .then(asyncFun2Res => {
//       console.log(asyncFun2Res);
//       return asyncFun3(asyncFun2Res);
//     })
//     .then(asyncFun3Res => {
//       console.log(asyncFun3Res);
//     })
//     .catch(error => {
//       console.error('An error occurred:', error);
//     });
// }

// callAsyncFunctions3();

// 使用 Promise 来处理异步操作解决地狱回调简介
// asyncDemo1.ts
function asyncFun1(str?: string): Promise<string>{
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`异步执行1${str||''}`);
    },3000)
  })
}

function asyncFun2(str?: string): Promise<string>{
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`异步执行2${str||''}`);
    }, 2000);
  });
}
function asyncFun3(str?: string): Promise<string> {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(`异步执行3${str || ''}`);
    }, 1000);
  });
}
// 调试代码1
// function callAsyncFunctions3() {
//   asyncFun1()                     //asyncFun1()：首先调用asyncFun1函数，不传递任何参数。
//     .then(asyncFun1Res => {       //当asyncFun1的Promise被解析后，使用.then方法来处理解析的结果。asyncFun1Res是asyncFun1解析后的值。
//       console.log(asyncFun1Res);//console.log(asyncFun1Res);：在控制台打印asyncFun1的解析结果。


//       return asyncFun2(asyncFun1Res);
//     })
//     .then(asyncFun2Res => {
//       console.log(asyncFun2Res);
//       return asyncFun3(asyncFun2Res);
//     })
//     .then(asyncFun3Res => {
//       console.log(asyncFun3Res);
//     })
//     .catch(error => {
//       console.error('An error occurred:', error);
//     });
// }

// callAsyncFunctions3();

// 调用方式2
async function callAsyncFunctions() {
  try {
    const asyncFun1Res = await asyncFun1();
    console.log(asyncFun1Res);

    const asyncFun2Res = await asyncFun2(asyncFun1Res);
    console.log(asyncFun2Res);

    const asyncFun3Res = await asyncFun3(asyncFun2Res);
    console.log(asyncFun3Res);
  } catch (error) {
    console.log('An error occurred:',error)    
  }
}
callAsyncFunctions();

